/*
https://leetcode.cn/problems/koko-eating-bananas/description/
875. 爱吃香蕉的珂珂
medium, 方钊堉 2024.09.17
二分查找
*/


class Solution {
public:
    int minEatingSpeed(vector<int>& piles, int h) {
        // 初始化二分查找的左右边界。
        // 最低进食速度为1，最高为所有堆里香蕉数的最大值。
        int left=1,ri = *max_element(piles.begin(),piles.end())+1;
        while(left<ri){
            // 计算中间速度。
            int p=(left+ri)>>1;
            // 计算按此速度吃完所有香蕉需要的时间。
            int ee=0;
            for(auto pile:piles) {
                // 向上取整
                ee+=(pile+p-1)/p;
            }
            if(ee>h) left=p+1;
            else ri=p;
        }
        // 当左右边界相邻时，left 为所需最小速度。
        return left;
    }
};